home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_08 / 9n08055b < prev    next >
Text File  |  1991-06-19  |  1KB  |  53 lines

  1. /***************** Listing 2 *************************
  2.  
  3.             Bilinear Interpolation
  4.  
  5.    double bilinear(image, x, y)
  6.      float *image, x, y;
  7.  
  8.    image: pointer to the four values of grid i.e.
  9.           a 2 x 2 array ( image[2][2] )
  10.    x    : sample coordinate
  11.    y    : line coordinate
  12.  
  13.                p
  14.             |------------->
  15.           image(0,0)         image(0,1)
  16.          -  *-------------------*
  17.          |  |                   |
  18.       q  V  |             o     |
  19.             |           (y,x)   |    y = line
  20.             |                   |    x = sample
  21.             |                   |
  22.             |                   |
  23.             *-------------------*
  24.          image(1,0)          image(1,1)
  25.  
  26.     If point "o" falls on upper left corner, then 
  27.     return image(0,0). The point should never fall on 
  28.     any of the other corners because the calling 
  29.     program will ensure against this according to the
  30.     filling sequence of the array image[2][2].
  31.  
  32. ******************************************************
  33. #include <stdio.h>
  34.  
  35. double bilinear(image, x, y)
  36.  float *image, x, y;
  37. {
  38.    register i;
  39.    float p, q;
  40.    double val = 0.0;
  41.  
  42.    p = x - (int) x;
  43.    q = y - (int) y;
  44.  
  45.    if( (p == 0.0) && (q == 0.0) )
  46.      return( (double) *image );   /* upper left */
  47.  
  48.    val = (p*q* *image++) + (q*(1-p)* *image++) +   \
  49.           (p*(1-q)* *image++) + ((1-p)*(1-q)* *image);
  50.  
  51.    return( val );
  52. }
  53.